package ar.edu.utn.frgp.banco.dao.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

import com.sun.xml.internal.bind.v2.util.FatalAdapter;

import ar.edu.utn.frgp.banco.dao.CuentaDao;
import ar.edu.utn.frgp.banco.dao.PagoPrestamosDao;
import ar.edu.utn.frgp.banco.dao.PrestamoDao;
import ar.edu.utn.frgp.banco.domain.enums.OrigenFondos;
import ar.edu.utn.frgp.banco.domain.enums.OrigenMovimiento;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.exceptions.PersonalisedException;
import ar.edu.utn.frgp.banco.utils.Constantes;

public class PagoPrestamosDaoImpl extends GenericDaoImpl implements PagoPrestamosDao {
	
	private CuentaDao cuentasDAO;
	
	public Boolean realizarPagoEfectivo(Long id, Date fecha, BigDecimal monto) throws DataAccessException{
		Connection con = null;
		
		String consulta = "INSERT INTO pago_prestamos (id_prestamo, fecha_pago, origen) VALUES(?,?,?)";
		
		PreparedStatement st = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			
			java.sql.Date date = new java.sql.Date(fecha.getTime());
			
			
			st.setLong(1, id);
			st.setDate(2, date);
			st.setString(3, OrigenFondos.EFECTIVO.getCodigo());
			
			st.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeConnection();
			closeStatement(st);
		}
		
		return true;
		
	}
	
	public Boolean realizarPagoEfectivoFinal(Long id, Date fecha, BigDecimal monto) throws DataAccessException{
		Connection con = null;
		
		String consulta = "INSERT INTO pago_prestamos (id_prestamo, fecha_pago, origen) VALUES(?,?,?)";
		
		PreparedStatement st = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			
			java.sql.Date date = new java.sql.Date(fecha.getTime());
			
			
			st.setLong(1, id);
			st.setDate(2, date);
			st.setString(3, OrigenFondos.EFECTIVO.getCodigo());
			
			st.executeUpdate();
			
			//como es la ultima cuota finalizo el prestamo
			PrestamoDao prestamoDAO = new PrestamoDaoImpl();
			
			prestamoDAO.finalizarPrestamo(id);
			
		} catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeConnection();
			closeStatement(st);
		}
		
		return true;
		
	}
	
	public Boolean realizarPago(Long id, Date fecha, Long cuenta, BigDecimal monto) throws PersonalisedException{
		Connection con = null;
		
		String consulta = "INSERT INTO pago_prestamos (id_prestamo, id_mov, fecha_pago, origen, nro_cuenta) VALUES(?,?,?,?,?)";
		
		PreparedStatement st = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			
			java.sql.Date date = new java.sql.Date(fecha.getTime());
			
			Long idMov = getId(Constantes.BD_SECUENCIA_MOVIMIENTOS);
			
			st.setLong(1, id);
			st.setLong(2, idMov);
			st.setDate(3, date);
			st.setString(4, OrigenFondos.CUENTA.getCodigo());
			st.setLong(5, cuenta);
			
			cuentasDAO = new CuentasDaoImpl();
			
			cuentasDAO.setConnection(con);

			cuentasDAO.extraccion(cuenta, monto , OrigenMovimiento.PRESTAMO);
			
			st.executeUpdate();
			
			commit();
			
		} catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeConnection();
			closeStatement(st);
		}
		
		return true;
	}

	@Override
	public Boolean realizarPagoFinal(Long id,Date fecha, Long cuenta, BigDecimal monto) throws PersonalisedException {
		Connection con = null;
		
		String consulta = "INSERT INTO pago_prestamos (id_prestamo, id_mov, fecha_pago, origen, nro_cuenta) VALUES(?,?,?,?,?)";
		
		PreparedStatement st = null;
		
		try {
			con = getConection();
			st = con.prepareStatement(consulta);
			
			java.sql.Date date = new java.sql.Date(fecha.getTime());
			
			Long idMov = getId(Constantes.BD_SECUENCIA_MOVIMIENTOS);
			
			st.setLong(1, id);
			st.setLong(2, idMov);
			st.setDate(3, date);
			st.setString(4, OrigenFondos.CUENTA.getCodigo());
			st.setLong(5, cuenta);
			
			cuentasDAO = new CuentasDaoImpl();
			
			cuentasDAO.setConnection(con);
			

			cuentasDAO.extraccion(cuenta, monto , OrigenMovimiento.PRESTAMO);
			
			st.executeUpdate();
			
			commit();
			
			//como es la ultima cuota finalizo el prestamo
			PrestamoDao prestamoDAO = new PrestamoDaoImpl();
			
			prestamoDAO.finalizarPrestamo(id);
			
		} catch (SQLException e) {
			throw new DataAccessException(Constantes.EXCEPCION_CONEXION_BD,e.getCause());
		} finally {
			closeConnection();
			closeStatement(st);
		}
		
		return true;
	}
}
